package design.mode.chapter3.item4.generator1;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Random;


/**
 * id生成器
 * 1. IdGenerator违背基于接口而非实现编程的设计思想
 * 2. 静态函数影响代码的可测试性
 * 3. 依赖运行环境、时间函数、随机函数 测试性能不太好
 * 4. 没有编写单元测试
 * 5. 可读性不好
 * 优点
 * 1. debug没有多余的冗余日志
 * 2. 没有共享变量、线程安全
 * 3. 性能足够
 *
 *
 * 第一轮重构：提高代码的可读性
 * 第二轮重构：提高代码的可测试性
 * 第三轮重构：编写完善的单元测试
 * 第四轮重构：所有重构完成之后添加注释
 */
public class IdGenerator {
//    private static final Logger logger = LoggerFactory.getLogger(IdGenerator.class);

    public static String generate() {
        String id = "";
        try {
            // 6. hostName为空的情况没有处理 7.比较消耗时间
            String hostName = InetAddress.getLocalHost().getHostName();
            System.out.println(hostName);
            String[] tokens = hostName.split("\\.");
            if (tokens.length > 0) {
                hostName = tokens[tokens.length - 1];
            }
            char[] randomChars = new char[8];
            int count = 0;
            Random random = new Random();
            // if语句代码相似
            while (count < 8) {
                // 算法需要优化
                int randomAscii = random.nextInt(122);
                if (randomAscii >= 48 && randomAscii <= 57) {
                    randomChars[count] = (char) ('0' + (randomAscii - 48));
                    count++;
                } else if (randomAscii >= 65 && randomAscii <= 90) {
                    randomChars[count] = (char) ('A' + (randomAscii - 65));
                    count++;
                } else if (randomAscii >= 97 && randomAscii <= 122) {
                    randomChars[count] = (char) ('a' + (randomAscii - 97));
                    count++;
                }
            }
            id = String.format("%s-%d-%s", hostName, System.currentTimeMillis(), new String(randomChars));
        } catch (UnknownHostException e) {
            // 7. 异常没有继续往上抛出
            // logger.warn("Failed to get the host name.", e);
        }
        return id;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            System.out.println(generate());
        }
    }
}